Агрегирование выборки в MongoDB + PHP
MongoDB - очередное веяние моды в веб-разработке, когда хранение данных заранее планируется таким огромным, что необходимо их распределение на несколько серверов с помощью шардирования. Поизучаем же непростой синтаксис агрегирования данных в mongo + php
Уникальное поле
Итак допустим есть коллекция объектов с повторяющимися полями, а нам хочется вытянуть только уникальные поля. В MySQL это делает DISTINCT(поле), здесь же надо запустить комманду которая вернёт только поле person_id.
$aObjects = $Mongo->command(array(
'distinct'=>'my_userlog_collection',
'key'=>'person_id',
'query'=>array(
'$or'=>array(
array('person_id' => new MongoRegex('/'.$sSearch.'.*/i')),
array('firstname' => new MongoRegex('/.*'.$sSearch.'.*/i')),
array('lastname' => new MongoRegex('/.*'.$sSearch.'.*/i')),
)
),
));
Как можно заметить одного лишь поля порой недостаточно - зачастую хочется сделать GROUP BY, т.е. повторяющиеся по заданным полям ряды склеиваются (а в случае различия других полей берётся первый из подходящих). В mongo такую пост-обработку результатов производят запускаемые пользовательские функции map, reduce и finalize. Я сначала было подумал что в адаптер Mongo надо передавать имя php-функции и даже начал смотреть синтаксис анонимных функций, но потом оказалось что передаются вовсе не функции а банально текст с javascript-функцией